package inge_soft.gestoriusNuevo.persistence.DAO.implementation;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Abstraction.GestoriusException;
import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Implementation.ErrorMergeInstitucion;
import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Implementation.UsuarioInexistenteException;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.IDomicilioDAO;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.IDomicilioTipificadoDAO;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Domicilio;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.DomicilioTipificado;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.EstadoInstitucion;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Institucion;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Pais;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Provincia;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.TipoDomicilio;

import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Repository("domicilioTipificadoDAO")
public class DomicilioTipificadoDAO implements IDomicilioTipificadoDAO {

	@PersistenceContext
	private EntityManager entityManager;
	
	@Transactional(propagation = Propagation.MANDATORY)
	public void crear(DomicilioTipificado domicilio,Institucion institucion) throws GestoriusException {
		// TODO Auto-generated method stub
		try {
			entityManager.persist(domicilio.getDomicilio());
			domicilio.setInstitucion(institucion);
			entityManager.persist(domicilio);



		} catch (DataAccessException e2) {
			throw e2;
		}
	}
	
	

	@Transactional(propagation = Propagation.MANDATORY)
	public void modificar(DomicilioTipificado domicilio,Institucion institucion)
			throws GestoriusException {
		// TODO Auto-generated method stub
		List<DomicilioTipificado> domicilios = new ArrayList<DomicilioTipificado>(institucion.getDomicilios());
		try {
			domicilios.set(domicilios.indexOf(domicilio), domicilio);
			entityManager.merge(domicilio);
		}
		catch(DataIntegrityViolationException e3){
			throw e3;
		}
		catch (DataAccessException e2) {
			throw e2;
		}
		
	}

	@Transactional(propagation = Propagation.MANDATORY)
	public void eliminar(DomicilioTipificado domicilio,Institucion institucion)
			throws GestoriusException {
		// TODO Auto-generated method stub
		
	}
	
	@Transactional(readOnly = true)
	public List<TipoDomicilio> obtenerTipoDomicilios() throws GestoriusException {
		return entityManager.createQuery("SELECT d FROM TipoDomicilio d").getResultList();
	}
	
	

}
